//使用axios进行网路请求,文档：http://www.axios-js.com
import axios from 'axios';
import {Toast} from 'antd-mobile';
import ToolRequestAxios from './ToolRequestAxios';
import {Tool, ToolDate, ToolHistory, ToolLocale} from './index';
import mockData from '../../mock';

/**
 * 网络请求
 * 1.封装公共参数，并使用AES、RSA加密；
 * 2.自动对密码等二次加密
 * 3.自动处理网络错误
 * 4.自动获取mock数据；
 * 5.自动从后端获取公钥
 */
export class ToolRequest extends ToolRequestAxios {
  /**
   * 初始化框架的公共信息：比如baseURL、超时时间、token等
   * 注意：登录后需要调用initRequest()，来设置token。
   */
  initRequest(data = {}) {
    const {timeout = 30, token = Tool.getItem('token')} = data;
    axios.defaults.timeout = timeout * 1000; //设置超时时间，单位为毫秒
    axios.defaults.headers.common.token = token; //设置token
  }

  /**
   * 处理Http状态码：axios会自动检查http状态码，状态码不正确，则抛出错误；网络超时，则抛出错误。
   * axios通过validateStatus函数检查http状态码，可以在config中配置validateStatus。默认的validateStatus为：
   *  status => status >= 200 && status < 300;
   * @param e 错误信息
   * @param requestConfig 请求参数
   */
  checkHttp({e, requestConfig}) {
    let {isShowError} = requestConfig.options;
    if (isShowError) {
      let result = ToolLocale.getNetwork(e.message);
      this.showError(result);
    }

    throw {isHttpError: true, dataError: e}; //抛出网络异常
  }

    /**
   * 提示错误信息，并抛出异常
   * @param msg 错误消息
   */
  showError(msg) {
    Toast.fail(msg);
  }

  /**
   * 跳转登录页
   */
  goLogin() {
    ToolHistory.href('/user/login');
  }

    /**
   * 获取格式化的时间戳
   * @param date 日期
   */
  getTimestamp(date) {
    return ToolDate.format(date, 'yyyyMMddhhmmss');
  }

  /**
   * 获取Mock数据
   */
  getMockData() {
    return mockData;
  }
  
}

//window._ENV_是通过webpack.DefinePlugin定义的系统变量
export default new ToolRequest(window._ENV_);
